From ecf4de11628b2295a7e9e6e3e4647863db88dc55 Mon Sep 17 00:00:00 2001 From: "kaf24@firebug.cl.cam.ac.uk" Date: Tue, 2 Aug 2005 12:18:47 +0000 Subject: [PATCH] This is the first patch to move the console code out of Xend and into a separate daemon. In this patch I've included the daemon and a front-end. I've also have the console code removed from Xend locally but I wanted to clarify a few things first before submitting that. Here's how it works: 1) Daemon sits on control channel (via xcs) waiting for console messages 2) Buffers all console data received 3) Publishes the location of a tty that can be used for reading in /console//tty 4) Reads a value from the store to determine what the limit of console data should be (/console//limit) to prevent DoS attacks Using it is quite simple, just run consoled and use the xc_console program to connect to the console. It uses syslog for logging. Signed-off-by: Anthony Liguori --- tools/consoled/Makefile | 48 ++++++ tools/consoled/consoled | Bin 0 -> 228029 bytes tools/consoled/io.c | 328 ++++++++++++++++++++++++++++++++++++ tools/consoled/io.h | 26 +++ tools/consoled/main.c | 93 ++++++++++ tools/consoled/utils.c | 251 +++++++++++++++++++++++++++ tools/consoled/utils.h | 47 ++++++ tools/consoled/xc_console | Bin 0 -> 94583 bytes tools/consoled/xc_console.c | 236 ++++++++++++++++++++++++++ 9 files changed, 1029 insertions(+) create mode 100644 tools/consoled/Makefile create mode 100755 tools/consoled/consoled create mode 100644 tools/consoled/io.c create mode 100644 tools/consoled/io.h create mode 100644 tools/consoled/main.c create mode 100644 tools/consoled/utils.c create mode 100644 tools/consoled/utils.h create mode 100755 tools/consoled/xc_console create mode 100644 tools/consoled/xc_console.c diff --git a/tools/consoled/Makefile b/tools/consoled/Makefile new file mode 100644 index 0000000000..879429e832 --- /dev/null +++ b/tools/consoled/Makefile @@ -0,0 +1,48 @@ +# Makefile for consoled +# based on xcs Makefile +# Anthony Liguori 2005 + +XEN_ROOT=../.. +include $(XEN_ROOT)/tools/Rules.mk + +CONSOLED_INSTALL_DIR = /usr/sbin +XC_CONSOLE_INSTALL_DIR = /usr/libexec/xen + +INSTALL = install +INSTALL_PROG = $(INSTALL) -m0755 +INSTALL_DIR = $(INSTALL) -d -m0755 + +CC = gcc +CFLAGS = -Wall -Werror -g3 + +CFLAGS += -I $(XEN_XCS) +CFLAGS += -I $(XEN_LIBXC) +CFLAGS += -I $(XEN_XENSTORE) + +SRCS := +SRCS += main.c utils.c io.c + +HDRS = $(wildcard *.h) +OBJS = $(patsubst %.c,%.o,$(SRCS)) +BIN = consoled + +all: $(BIN) xc_console + +clean: + $(RM) *.a *.so *.o *.rpm $(BIN) xc_console + +$(BIN): $(OBJS) + $(CC) $(CFLAGS) $^ -o $@ -L$(XEN_LIBXC) -L$(XEN_XENSTORE) \ + -lxc -lxenstore + +xc_console: xc_console.o + $(CC) $(CFLAGS) $^ -o $@ -L$(XEN_LIBXC) -L$(XEN_XENSTORE) \ + -lxc -lxenstore + +$(OBJS): $(HDRS) + +install: $(BIN) + $(INSTALL_DIR) -p $(DESTDIR)/$(CONSOLED_INSTALL_DIR) + $(INSTALL_PROG) $(BIN) $(DESTDIR)/$(CONSOLED_INSTALL_DIR) + $(INSTALL_DIR) -p $(DESTDIR)/$(XC_CONSOLE_INSTALL_DIR) + $(INSTALL_PROG) xc_console $(DESTDIR)/$(XC_CONSOLE_INSTALL_DIR) diff --git a/tools/consoled/consoled b/tools/consoled/consoled new file mode 100755 index 0000000000000000000000000000000000000000..8ce8f8e8506976e21dde55d65f9624c5c5cda3a5 GIT binary patch literal 228029 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 z

;);FZj1W0cy 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 literal 0 HcmV?d00001 diff --git a/tools/consoled/io.c b/tools/consoled/io.c new file mode 100644 index 0000000000..1dc9c7385d --- /dev/null +++ b/tools/consoled/io.c @@ -0,0 +1,328 @@ +/*\ + * Copyright (C) International Business Machines Corp., 2005 + * Author(s): Anthony Liguori + * + * Xen Console Daemon + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; under version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +\*/ + +#define _GNU_SOURCE + +#include "utils.h" +#include "io.h" + +#include "xc.h" +#include "xs.h" +#include "xen/io/domain_controller.h" +#include "xcs_proto.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +#define MAX(a, b) (((a) > (b)) ? (a) : (b)) +#define MIN(a, b) (((a) < (b)) ? (a) : (b)) + +struct buffer +{ + char *data; + size_t size; + size_t capacity; + size_t max_capacity; +}; + +void buffer_append(struct buffer *buffer, const void *data, size_t size) +{ + if ((buffer->capacity - buffer->size) < size) { + buffer->capacity += (size + 1024); + buffer->data = realloc(buffer->data, buffer->capacity); + if (buffer->data == NULL) { + dolog(LOG_ERR, "Memory allocation failed"); + exit(ENOMEM); + } + } + + memcpy(buffer->data + buffer->size, data, size); + buffer->size += size; + + if (buffer->max_capacity && + buffer->size > buffer->max_capacity) { + memmove(buffer->data + (buffer->size - buffer->max_capacity), + buffer->data, buffer->max_capacity); + buffer->data = realloc(buffer->data, buffer->max_capacity); + buffer->capacity = buffer->max_capacity; + } +} + +bool buffer_empty(struct buffer *buffer) +{ + return buffer->size == 0; +} + +void buffer_advance(struct buffer *buffer, size_t size) +{ + size = MIN(size, buffer->size); + memmove(buffer->data, buffer + size, buffer->size - size); + buffer->size -= size; +} + +struct domain +{ + int domid; + int tty_fd; + struct buffer buffer; + struct domain *next; +}; + +static struct domain *dom_head; + +bool domain_is_valid(int domid) +{ + bool ret; + xc_dominfo_t info; + + ret = (xc_domain_getinfo(xc, domid, 1, &info) == 1 && + info.domid == domid); + + return ret; +} + +int domain_create_tty(int domid) +{ + char path[1024]; + int master; + + if ((master = getpt()) == -1 || + grantpt(master) == -1 || unlockpt(master) == -1) { + dolog(LOG_ERR, "Failed to create tty for domain-%d", domid); + master = -1; + } else { + const char *slave = ptsname(master); + struct termios term; + + if (tcgetattr(master, &term) != -1) { + cfmakeraw(&term); + tcsetattr(master, TCSAFLUSH, &term); + } + + xs_mkdir(xs, "/console"); + snprintf(path, sizeof(path), "/console/%d", domid); + xs_mkdir(xs, path); + strcat(path, "/tty"); + + xs_write(xs, path, slave, strlen(slave), O_CREAT); + } + + return master; +} + +struct domain *create_domain(int domid) +{ + struct domain *dom; + char *data; + unsigned int len; + char path[1024]; + + dom = (struct domain *)malloc(sizeof(struct domain)); + if (dom == NULL) { + dolog(LOG_ERR, "Out of memory %s:%s():L%d", + __FILE__, __FUNCTION__, __LINE__); + exit(ENOMEM); + } + + dom->domid = domid; + dom->tty_fd = domain_create_tty(domid); + dom->buffer.data = 0; + dom->buffer.size = 0; + dom->buffer.capacity = 0; + dom->buffer.max_capacity = 0; + + snprintf(path, sizeof(path), "/console/%d/limit", domid); + data = xs_read(xs, path, &len); + if (data) { + dom->buffer.max_capacity = strtoul(data, 0, 0); + free(data); + } + + dolog(LOG_DEBUG, "New domain %d", domid); + + return dom; +} + +struct domain *lookup_domain(int domid) +{ + struct domain **pp; + + for (pp = &dom_head; *pp; pp = &(*pp)->next) { + struct domain *dom = *pp; + + if (dom->domid == domid) { + return dom; + } else if (dom->domid > domid) { + *pp = create_domain(domid); + (*pp)->next = dom; + return *pp; + } + } + + *pp = create_domain(domid); + return *pp; +} + +void remove_domain(struct domain *dom) +{ + struct domain **pp; + + dolog(LOG_DEBUG, "Removing domain-%d", dom->domid); + + for (pp = &dom_head; *pp; pp = &(*pp)->next) { + struct domain *d = *pp; + + if (dom->domid == d->domid) { + *pp = d->next; + free(d); + break; + } + } +} + +void handle_tty_read(struct domain *dom) +{ + ssize_t len; + xcs_msg_t msg; + + msg.type = XCS_REQUEST; + msg.u.control.remote_dom = dom->domid; + msg.u.control.msg.type = CMSG_CONSOLE; + msg.u.control.msg.subtype = CMSG_CONSOLE_DATA; + msg.u.control.msg.id = 1; + + len = read(dom->tty_fd, msg.u.control.msg.msg, 60); + if (len < 1) { + close(dom->tty_fd); + + if (domain_is_valid(dom->domid)) { + dom->tty_fd = domain_create_tty(dom->domid); + } else { + remove_domain(dom); + } + } else if (domain_is_valid(dom->domid)) { + msg.u.control.msg.length = len; + + if (!write_sync(xcs_data_fd, &msg, sizeof(msg))) { + dolog(LOG_ERR, "Write to xcs failed: %m"); + } + } else { + close(dom->tty_fd); + remove_domain(dom); + } +} + +void handle_tty_write(struct domain *dom) +{ + ssize_t len; + + len = write(dom->tty_fd, dom->buffer.data, dom->buffer.size); + if (len < 1) { + close(dom->tty_fd); + + if (domain_is_valid(dom->domid)) { + dom->tty_fd = domain_create_tty(dom->domid); + } else { + remove_domain(dom); + } + } else { + buffer_advance(&dom->buffer, len); + } +} + +void handle_xcs_msg(int fd) +{ + xcs_msg_t msg; + + if (!read_sync(fd, &msg, sizeof(msg))) { + dolog(LOG_ERR, "read from xcs failed! %m"); + } else if (msg.type == XCS_REQUEST) { + struct domain *dom; + + dom = lookup_domain(msg.u.control.remote_dom); + buffer_append(&dom->buffer, + msg.u.control.msg.msg, + msg.u.control.msg.length); + } +} + +static void enum_domains(void) +{ + int domid = 0; + xc_dominfo_t dominfo; + + while (xc_domain_getinfo(xc, domid, 1, &dominfo) == 1) { + lookup_domain(dominfo.domid); + domid = dominfo.domid + 1; + } +} + +void handle_io(void) +{ + fd_set readfds, writefds; + int ret; + int max_fd = -1; + + do { + struct domain *d; + struct timeval tv = { 1, 0 }; + + FD_ZERO(&readfds); + FD_ZERO(&writefds); + + FD_SET(xcs_data_fd, &readfds); + max_fd = MAX(xcs_data_fd, max_fd); + + for (d = dom_head; d; d = d->next) { + if (d->tty_fd != -1) { + FD_SET(d->tty_fd, &readfds); + } + + if (d->tty_fd != -1 && !buffer_empty(&d->buffer)) { + FD_SET(d->tty_fd, &writefds); + } + + max_fd = MAX(d->tty_fd, max_fd); + } + + ret = select(max_fd + 1, &readfds, &writefds, 0, &tv); + enum_domains(); + + if (FD_ISSET(xcs_data_fd, &readfds)) { + handle_xcs_msg(xcs_data_fd); + } + + for (d = dom_head; d; d = d->next) { + if (FD_ISSET(d->tty_fd, &readfds)) { + handle_tty_read(d); + } + + if (FD_ISSET(d->tty_fd, &writefds)) { + handle_tty_write(d); + } + } + } while (ret > -1); +} diff --git a/tools/consoled/io.h b/tools/consoled/io.h new file mode 100644 index 0000000000..f658bfcea0 --- /dev/null +++ b/tools/consoled/io.h @@ -0,0 +1,26 @@ +/*\ + * Copyright (C) International Business Machines Corp., 2005 + * Author(s): Anthony Liguori + * + * Xen Console Daemon + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; under version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +\*/ + +#ifndef CONSOLED_IO_H +#define CONSOLED_IO_H + +void handle_io(void); + +#endif diff --git a/tools/consoled/main.c b/tools/consoled/main.c new file mode 100644 index 0000000000..e453a62625 --- /dev/null +++ b/tools/consoled/main.c @@ -0,0 +1,93 @@ +/*\ + * Copyright (C) International Business Machines Corp., 2005 + * Author(s): Anthony Liguori + * + * Xen Console Daemon + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; under version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +\*/ + +#include +#include +#include +#include +#include +#include + +#include "xc.h" +#include "xen/io/domain_controller.h" +#include "xcs_proto.h" + +#include "utils.h" +#include "io.h" + +int main(int argc, char **argv) +{ + const char *sopts = "hVvi"; + struct option lopts[] = { + { "help", 0, 0, 'h' }, + { "version", 0, 0, 'V' }, + { "verbose", 0, 0, 'v' }, + { "interactive", 0, 0, 'i' }, + { 0 }, + }; + bool is_interactive = false; + int ch; + int syslog_option = LOG_CONS; + int syslog_mask = LOG_WARNING; + int opt_ind = 0; + + while ((ch = getopt_long(argc, argv, sopts, lopts, &opt_ind)) != -1) { + switch (ch) { + case 'h': + //usage(argv[0]); + exit(0); + case 'V': + //version(argv[0]); + exit(0); + case 'v': + syslog_option |= LOG_PERROR; + syslog_mask = LOG_DEBUG; + break; + case 'i': + is_interactive = true; + break; + case '?': + fprintf(stderr, + "Try `%s --help' for more information\n", + argv[0]); + exit(EINVAL); + } + } + + if (geteuid() != 0) { + fprintf(stderr, "%s requires root to run.\n", argv[0]); + exit(EPERM); + } + + openlog("consoled", syslog_option, LOG_DAEMON); + setlogmask(syslog_mask); + + if (!is_interactive) { + daemonize("/var/run/consoled.pid"); + } + + xen_setup(); + + handle_io(); + + closelog(); + + return 0; +} diff --git a/tools/consoled/utils.c b/tools/consoled/utils.c new file mode 100644 index 0000000000..6bc7cfd3a5 --- /dev/null +++ b/tools/consoled/utils.c @@ -0,0 +1,251 @@ +/*\ + * Copyright (C) International Business Machines Corp., 2005 + * Author(s): Anthony Liguori + * + * Xen Console Daemon + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; under version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +\*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "xc.h" +#include "xen/io/domain_controller.h" +#include "xcs_proto.h" + +#include "utils.h" + +struct xs_handle *xs; +int xc; + +int xcs_ctrl_fd = -1; +int xcs_data_fd = -1; + +bool _read_write_sync(int fd, void *data, size_t size, bool do_read) +{ + size_t offset = 0; + ssize_t len; + + while (offset < size) { + if (do_read) { + len = read(fd, data + offset, size - offset); + } else { + len = write(fd, data + offset, size - offset); + } + + if (len < 1) { + if (len == -1 && (errno == EAGAIN || errno == EINTR)) { + return false; + } + } else { + offset += len; + } + } + + return true; +} + +static int open_domain_socket(const char *path) +{ + struct sockaddr_un addr; + int sock; + size_t addr_len; + + if ((sock = socket(PF_UNIX, SOCK_STREAM, 0)) == -1) { + goto out; + } + + addr.sun_family = AF_UNIX; + strcpy(addr.sun_path, path); + addr_len = sizeof(addr.sun_family) + strlen(XCS_SUN_PATH) + 1; + + if (connect(sock, (struct sockaddr *)&addr, addr_len) == -1) { + goto out_close_sock; + } + + return sock; + + out_close_sock: + close(sock); + out: + return -1; +} + +static void child_exit(int sig) +{ + while (waitpid(-1, NULL, WNOHANG) > 0); +} + +void daemonize(const char *pidfile) +{ + pid_t pid; + int fd; + int len; + int i; + char buf[100]; + + if (getppid() == 1) { + return; + } + + if ((pid = fork()) > 0) { + exit(0); + } else if (pid == -1) { + err(errno, "fork() failed"); + } + + setsid(); + + /* redirect fd 0,1,2 to /dev/null */ + if ((fd = open("/dev/null",O_RDWR)) == -1) { + exit(1); + } + + for (i = 0; i <= 2; i++) { + close(i); + dup2(fd, i); + } + + close(fd); + + umask(027); + chdir("/"); + + fd = open(pidfile, O_RDWR | O_CREAT); + if (fd == -1) { + exit(1); + } + + if (lockf(fd, F_TLOCK, 0) == -1) { + exit(1); + } + + len = sprintf(buf, "%d\n", getpid()); + write(fd, buf, len); + + signal(SIGCHLD, child_exit); + signal(SIGTSTP, SIG_IGN); + signal(SIGTTOU, SIG_IGN); + signal(SIGTTIN, SIG_IGN); +} + +/* synchronized send/recv strictly for setting up xcs */ +/* always use asychronize callbacks any other time */ +static bool xcs_send_recv(int fd, xcs_msg_t *msg) +{ + bool ret = false; + + if (!write_sync(fd, msg, sizeof(*msg))) { + dolog(LOG_ERR, "Write failed at %s:%s():L%d? Possible bug.", + __FILE__, __FUNCTION__, __LINE__); + goto out; + } + + if (!read_sync(fd, msg, sizeof(*msg))) { + dolog(LOG_ERR, "Read failed at %s:%s():L%d? Possible bug.", + __FILE__, __FUNCTION__, __LINE__); + goto out; + } + + ret = true; + + out: + return ret; +} + +bool xen_setup(void) +{ + int sock; + xcs_msg_t msg; + + xs = xs_daemon_open(); + if (xs == NULL) { + dolog(LOG_ERR, + "Failed to contact xenstore (%m). Is it running?"); + goto out; + } + + xc = xc_interface_open(); + if (xc == -1) { + dolog(LOG_ERR, "Failed to contact hypervisor (%m)"); + goto out; + } + + sock = open_domain_socket(XCS_SUN_PATH); + if (sock == -1) { + dolog(LOG_ERR, "Failed to contact xcs (%m). Is it running?"); + goto out_close_store; + } + + xcs_ctrl_fd = sock; + + sock = open_domain_socket(XCS_SUN_PATH); + if (sock == -1) { + dolog(LOG_ERR, "Failed to contact xcs (%m). Is it running?"); + goto out_close_ctrl; + } + + xcs_data_fd = sock; + + memset(&msg, 0, sizeof(msg)); + msg.type = XCS_CONNECT_CTRL; + if (!xcs_send_recv(xcs_ctrl_fd, &msg) || msg.result != XCS_RSLT_OK) { + dolog(LOG_ERR, "xcs control connect failed. Possible bug."); + goto out_close_data; + } + + msg.type = XCS_CONNECT_DATA; + if (!xcs_send_recv(xcs_data_fd, &msg) || msg.result != XCS_RSLT_OK) { + dolog(LOG_ERR, "xcs data connect failed. Possible bug."); + goto out_close_data; + } + + /* Since the vast majority of control messages are console messages + it's just easier to ignore other messages that try to bind to + a specific type. */ + msg.type = XCS_MSG_BIND; + msg.u.bind.port = PORT_WILDCARD; + msg.u.bind.type = TYPE_WILDCARD; + if (!xcs_send_recv(xcs_ctrl_fd, &msg) || msg.result != XCS_RSLT_OK) { + dolog(LOG_ERR, "xcs vind failed. Possible bug."); + goto out_close_data; + } + + return true; + + out_close_data: + close(xcs_ctrl_fd); + xcs_data_fd = -1; + out_close_ctrl: + close(xcs_ctrl_fd); + xcs_ctrl_fd = -1; + out_close_store: + xs_daemon_close(xs); + out: + return false; +} + diff --git a/tools/consoled/utils.h b/tools/consoled/utils.h new file mode 100644 index 0000000000..9e0887c044 --- /dev/null +++ b/tools/consoled/utils.h @@ -0,0 +1,47 @@ +/*\ + * Copyright (C) International Business Machines Corp., 2005 + * Author(s): Anthony Liguori + * + * Xen Console Daemon + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; under version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +\*/ + +#ifndef CONSOLED_UTILS_H +#define CONSOLED_UTILS_H + +#include +#include +#include + +#include "xs.h" + +void daemonize(const char *pidfile); +bool xen_setup(void); +#define read_sync(fd, buffer, size) _read_write_sync(fd, buffer, size, true) +#define write_sync(fd, buffer, size) _read_write_sync(fd, buffer, size, false) +bool _read_write_sync(int fd, void *data, size_t size, bool do_read); + +extern int xcs_ctrl_fd; +extern int xcs_data_fd; +extern struct xs_handle *xs; +extern int xc; + +#if 1 +#define dolog(val, fmt, ...) syslog(val, fmt, ## __VA_ARGS__) +#else +#define dolog(val, fmt, ...) fprintf(stderr, fmt "\n", ## __VA_ARGS__) +#endif + +#endif diff --git a/tools/consoled/xc_console b/tools/consoled/xc_console new file mode 100755 index 0000000000000000000000000000000000000000..89a933e8101511f4866ec4fbf4b38bb701c7a2ba GIT binary patch literal 94583 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 OXhvp&q~F){k^c+kPhtlE literal 0 HcmV?d00001 diff --git a/tools/consoled/xc_console.c b/tools/consoled/xc_console.c new file mode 100644 index 0000000000..2d77dc8e5f --- /dev/null +++ b/tools/consoled/xc_console.c @@ -0,0 +1,236 @@ +/*\ + * Copyright (C) International Business Machines Corp., 2005 + * Author(s): Anthony Liguori + * + * Xen Console Daemon + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; under version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +\*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "xc.h" +#include "xs.h" + +#define ESCAPE_CHARACTER 0x1d + +static volatile sig_atomic_t received_signal = 0; + +static void sighandler(int signum) +{ + received_signal = 1; +} + +static bool write_sync(int fd, const void *data, size_t size) +{ + size_t offset = 0; + ssize_t len; + + while (offset < size) { + len = write(fd, data + offset, size - offset); + if (len < 1) { + return false; + } + offset += len; + } + + return true; +} + +static void usage(const char *program) { + printf("Usage: %s [OPTION] DOMID\n" + "Attaches to a virtual domain console\n" + "\n" + " -h, --help display this help and exit\n" + , program); +} + +/* don't worry too much if setting terminal attributes fail */ +static void init_term(int fd, struct termios *old) +{ + struct termios new_term; + + if (tcgetattr(fd, old) == -1) { + perror("tcgetattr() failed"); + return; + } + + new_term = *old; + cfmakeraw(&new_term); + + if (tcsetattr(fd, TCSAFLUSH, &new_term) == -1) { + perror("tcsetattr() failed"); + } +} + +static void restore_term(int fd, struct termios *old) +{ + if (tcsetattr(fd, TCSAFLUSH, old) == -1) { + perror("tcsetattr() failed"); + } +} + +static int console_loop(int xc_handle, domid_t domid, int fd) +{ + int ret; + + do { + fd_set fds; + + FD_ZERO(&fds); + FD_SET(STDIN_FILENO, &fds); + FD_SET(fd, &fds); + + ret = select(fd + 1, &fds, NULL, NULL, NULL); + if (ret == -1) { + if (errno == EINTR || errno == EAGAIN) { + continue; + } + perror("select() failed"); + return -1; + } + + if (FD_ISSET(STDIN_FILENO, &fds)) { + ssize_t len; + char msg[60]; + + len = read(STDIN_FILENO, msg, sizeof(msg)); + if (len == 1 && msg[0] == ESCAPE_CHARACTER) { + return 0; + } + + if (len == 0 && len == -1) { + if (len == -1 && + (errno == EINTR || errno == EAGAIN)) { + continue; + } + perror("select() failed"); + return -1; + } + + if (!write_sync(fd, msg, len)) { + perror("write() failed"); + return -1; + } + } + + if (FD_ISSET(fd, &fds)) { + ssize_t len; + char msg[512]; + + len = read(fd, msg, sizeof(msg)); + if (len == 0 || len == -1) { + if (len == -1 && + (errno == EINTR || errno == EAGAIN)) { + continue; + } + perror("select() failed"); + return -1; + } + + if (!write_sync(STDOUT_FILENO, msg, len)) { + perror("write() failed"); + return -1; + } + } + } while (received_signal == 0); + + return 0; +} + +int main(int argc, char **argv) +{ + struct termios attr; + int domid; + int xc_handle; + char *sopt = "hf:pc"; + int ch; + int opt_ind=0; + struct option lopt[] = { + { "help", 0, 0, 'h' }, + { "file", 1, 0, 'f' }, + { "pty", 0, 0, 'p' }, + { "ctty", 0, 0, 'c' }, + { 0 }, + + }; + char *str_pty; + char path[1024]; + int spty; + unsigned int len = 0; + struct xs_handle *xs; + + while((ch = getopt_long(argc, argv, sopt, lopt, &opt_ind)) != -1) { + switch(ch) { + case 'h': + usage(argv[0]); + exit(0); + break; + } + } + + if ((argc - optind) != 1) { + fprintf(stderr, "Invalid number of arguments\n"); + fprintf(stderr, "Try `%s --help' for more information.\n", + argv[0]); + exit(EINVAL); + } + + domid = atoi(argv[optind]); + + xs = xs_daemon_open(); + if (xs == NULL) { + err(errno, "Could not contact XenStore"); + } + + xc_handle = xc_interface_open(); + if (xc_handle == -1) { + err(errno, "xc_interface_open()"); + } + + signal(SIGTERM, sighandler); + + snprintf(path, sizeof(path), "/console/%d/tty", domid); + str_pty = xs_read(xs, path, &len); + if (str_pty == NULL) { + err(errno, "Could not read tty from store"); + } + spty = open(str_pty, O_RDWR | O_NOCTTY); + if (spty == -1) { + err(errno, "Could not open tty `%s'", str_pty); + } + free(str_pty); + + init_term(STDIN_FILENO, &attr); + console_loop(xc_handle, domid, spty); + restore_term(STDIN_FILENO, &attr); + + return 0; + } -- 2.30.2